package com.suda.jpa.Dao;

import com.suda.jpa.Entity.Pet;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

/*
    JpaRepository<T,ID> 是 JPA 提供的一个接口,接口的当中定义了CRUD基本操作
        T 指定具体操作的实体类
        ID 指定主键字段的类型(实体类当中带有 @Id 注解的属性)
*/
public interface PetDao extends JpaRepository<Pet,Integer>{

    /*
      当JpaRepository 接口当中提供的方法不能正常满足实际业务需求时,则可以使用自定义查询
        方法的名称必须满足相应的规范
            方法的返回值是根据实际的业务需求定义,如: List Pet
            方法的名称必须满足规范: findByXxx , findBy 是固定开始 Xxx是属性名称,如 findByPname
            参数列表: 根据实际的业务需求定义
     */
    List<Pet> findByColor(String color);

    //多条件查询
    List<Pet> findByPnameAndColor(String pname,String color);

    //查询并排序
    List<Pet> findByIdBetweenOrderById(Integer minId, Integer maxId);


    /*
      JPQL查询,操作的是java当中的实体类对象
      注意细节
        不能出现表名,列名,只能出现 java 的类名或属性名且区分大小写
        关键字不区分大小写
        不能写select *,要写select 别名

         sql: select * from t_pet
         jpql: from com.yd.domain.Pet 或 select pet from Pet pet;
    */
    @Query("FROM com.suda.jpa.Entity.Pet")
    List<Pet> loadPetsList1();

    /*
        查询 t_pet 表当中的 id pname color
            sql： select id,pname ,color from t_pet;
            jpql: select id,pname,color from com.yd.domain.Pet pet
        查询的结果集并没有直接封装到 pet 对象当中,而是封装到了Object[],所以如果使用 pet 接收,就会出现异常
    */
    @Query("SELECT id, pname, color FROM com.suda.jpa.Entity.Pet")
    List<Object[]> loadPetsList2();

    //查询的记录数直接封装到实体类,需要调用实体类的构造方法
    @Query("SELECT new com.suda.jpa.Entity.Pet(id, pname, color) FROM com.suda.jpa.Entity.Pet")
    List<Pet> loadPetsList3();

}
